const { app, BrowserWindow, Menu, ipcMain, dialog, clipboard, shell, Tray, nativeImage } = require('electron')
const path = require('path')
const fs = require('fs').promises
const crypto = require('crypto')
// 使用内置的 crypto 模块替代 bcrypt

let mainWindow
let tray = null
let isAppLocked = true
let appSettings = {
  startMinimized: false,
  minimizeOnClose: false,
  language: 'zh-CN'
}

// 数据文件路径
const dataPath = path.join(app.getPath('userData'), 'encrypted-data.json')
const settingsPath = path.join(app.getPath('userData'), 'app-settings.json')

// 加载应用设置
async function loadAppSettings() {
  try {
    const data = await fs.readFile(settingsPath, 'utf8')
    appSettings = { ...appSettings, ...JSON.parse(data) }
  } catch (error) {
  }
}

// 保存应用设置
async function saveAppSettings() {
  try {
    await fs.writeFile(settingsPath, JSON.stringify(appSettings, null, 2))
  } catch (error) {
    console.error('保存设置失败:', error)
  }
}

// 创建系统托盘
function createTray() {
  // 创建托盘图标 (使用简单的图标数据)
  const iconData = Buffer.from([
    0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A,
    // 这里是一个简单的16x16 PNG图标数据
  ])
  
  // 创建托盘图标（使用系统默认图标）
  tray = new Tray(nativeImage.createEmpty())
  
  // 设置托盘菜单
  const contextMenu = Menu.buildFromTemplate([
    {
      label: '显示主窗口',
      click: () => {
        mainWindow.show()
        mainWindow.focus()
      }
    },
    {
      label: '锁定应用',
      click: () => {
        isAppLocked = true
        mainWindow.webContents.send('app-lock')
      }
    },
    { type: 'separator' },
    {
      label: '退出',
      click: () => {
        app.isQuiting = true
        app.quit()
      }
    }
  ])
  
  tray.setContextMenu(contextMenu)
  tray.setToolTip('密码管理器')
  
  // 双击托盘图标显示窗口
  tray.on('double-click', () => {
    mainWindow.show()
    mainWindow.focus()
  })
}

async function createWindow() {
  // 加载应用设置
  await loadAppSettings()
  
  mainWindow = new BrowserWindow({
    width: 1200,
    height: 800,
    minWidth: 900,
    minHeight: 600,
    webPreferences: {
      nodeIntegration: false,
      contextIsolation: true,
      preload: path.join(__dirname, 'preload.js')
    },
    icon: path.join(__dirname, '../../assets/icon.png'),
    show: !appSettings.startMinimized, // 根据设置决定是否显示窗口
    titleBarStyle: 'default'
  })

  // 检查是否为开发模式
  const isDev = process.env.NODE_ENV === 'development' || process.argv.includes('--dev')
  
  if (isDev) {
    // 开发模式下加载本地服务器
    mainWindow.loadURL('http://localhost:5173')
    mainWindow.webContents.openDevTools()
  } else {
    // 生产模式下加载打包后的文件
    const rendererPath = path.join(__dirname, '../../dist-renderer/index.html')
    console.log('Loading renderer from:', rendererPath)
    mainWindow.loadFile(rendererPath)
  }
  
  // 创建系统托盘
  createTray()
  
  // 处理窗口关闭事件
  mainWindow.on('close', (event) => {
    if (appSettings.minimizeOnClose && !app.isQuiting) {
      event.preventDefault()
      mainWindow.hide()
    }
  })
  
  // 处理窗口最小化
  mainWindow.on('minimize', () => {
    if (process.platform === 'darwin') {
      // macOS 上隐藏到 Dock
      mainWindow.hide()
    }
  })

  mainWindow.once('ready-to-show', () => {
    if (!appSettings.startMinimized) {
      mainWindow.show()
    }
  })

  mainWindow.on('closed', () => {
    mainWindow = null
  })

  // 设置菜单
  createMenu()
}

const { createMenuTemplate } = require('./menu-template')

function createMenu() {
  const template = createMenuTemplate(mainWindow)
  const menu = Menu.buildFromTemplate(template)
  Menu.setApplicationMenu(menu)
}

// 临时保留旧菜单定义以防需要回滚
function createOldMenu() {
  const template = [
    {
      label: '文件',
      submenu: [
        {
          label: '新建账号',
          accelerator: 'CmdOrCtrl+N',
          click: () => {
            mainWindow.webContents.send('menu-new-account')
          }
        },
        { type: 'separator' },
        {
          label: '导入数据',
          accelerator: 'CmdOrCtrl+I',
          click: () => {
            mainWindow.webContents.send('menu-import')
          }
        },
        {
          label: '导出数据',
          accelerator: 'CmdOrCtrl+E',
          click: () => {
            mainWindow.webContents.send('menu-export')
          }
        },
        { type: 'separator' },
        {
          label: '刷新数据',
          accelerator: 'CmdOrCtrl+R',
          click: () => {
            mainWindow.webContents.send('menu-refresh')
          }
        },
        {
          label: '锁定应用',
          accelerator: 'CmdOrCtrl+L',
          click: () => {
            mainWindow.webContents.send('app-lock')
          }
        },
        { type: 'separator' },
        {
          label: '退出',
          accelerator: process.platform === 'darwin' ? 'Cmd+Q' : 'Ctrl+Q',
          click: () => {
            app.quit()
          }
        }
      ]
    },
    {
      label: '编辑',
      submenu: [
        {
          label: '撤销',
          accelerator: 'CmdOrCtrl+Z',
          click: () => {
            mainWindow.webContents.send('menu-undo')
          }
        },
        {
          label: '重做',
          accelerator: 'CmdOrCtrl+Y',
          click: () => {
            mainWindow.webContents.send('menu-redo')
          }
        },
        { type: 'separator' },
        {
          label: '剪切',
          accelerator: 'CmdOrCtrl+X',
          click: () => {
            mainWindow.webContents.send('menu-cut')
          }
        },
        {
          label: '复制',
          accelerator: 'CmdOrCtrl+C',
          click: () => {
            mainWindow.webContents.send('menu-copy')
          }
        },
        {
          label: '粘贴',
          accelerator: 'CmdOrCtrl+V',
          click: () => {
            mainWindow.webContents.send('menu-paste')
          }
        },
        {
          label: '全选',
          accelerator: 'CmdOrCtrl+A',
          click: () => {
            mainWindow.webContents.send('menu-select-all')
          }
        },
        { type: 'separator' },
        {
          label: '搜索',
          accelerator: 'CmdOrCtrl+F',
          click: () => {
            mainWindow.webContents.send('menu-search')
          }
        },
        {
          label: '清除搜索',
          click: () => {
            mainWindow.webContents.send('menu-clear-search')
          }
        },
        { type: 'separator' },
        {
          label: '复制用户名',
          click: () => {
            mainWindow.webContents.send('menu-copy-username')
          }
        },
        {
          label: '复制密码',
          click: () => {
            mainWindow.webContents.send('menu-copy-password')
          }
        }
      ]
    },
    {
      label: '视图',
      submenu: [
        { role: 'undo', label: '撤销' },
        { role: 'redo', label: '重做' },
        { type: 'separator' },
        { role: 'cut', label: '剪切' },
        { role: 'copy', label: '复制' },
        { role: 'paste', label: '粘贴' },
        { role: 'selectall', label: '全选' },
        { type: 'separator' },
        {
          label: '查找',
          accelerator: 'CmdOrCtrl+F',
          click: () => {
            mainWindow.webContents.send('menu-search')
          }
        },
        {
          label: '清除搜索',
          accelerator: 'CmdOrCtrl+Shift+F',
          click: () => {
            mainWindow.webContents.send('menu-clear-search')
          }
        },
        { type: 'separator' },
        {
          label: '复制选中账号用户名',
          accelerator: 'CmdOrCtrl+Shift+U',
          click: () => {
            mainWindow.webContents.send('menu-copy-username')
          }
        },
        {
          label: '复制选中账号密码',
          accelerator: 'CmdOrCtrl+Shift+P',
          click: () => {
            mainWindow.webContents.send('menu-copy-password')
          }
        }
      ]
    },
    {
      label: '工具',
      submenu: [
        {
          label: '密码生成器',
          accelerator: 'CmdOrCtrl+G',
          click: () => {
            mainWindow.webContents.send('menu-password-generator')
          }
        },
        {
          label: '安全检查',
          accelerator: 'CmdOrCtrl+S',
          click: () => {
            mainWindow.webContents.send('menu-security-check')
          }
        },
        { type: 'separator' },
        {
          label: '密码强度分析',
          accelerator: 'CmdOrCtrl+1',
          click: () => {
            mainWindow.webContents.send('menu-password-analysis')
          }
        },
        {
          label: '重复密码检查',
          accelerator: 'CmdOrCtrl+2',
          click: () => {
            mainWindow.webContents.send('menu-duplicate-check')
          }
        },
        {
          label: '数据备份',
          accelerator: 'CmdOrCtrl+3',
          click: () => {
            mainWindow.webContents.send('menu-backup')
          }
        },
                    {
                      label: '数据清理',
                      accelerator: 'CmdOrCtrl+4',
                      click: () => {
                        mainWindow.webContents.send('menu-cleanup')
                      }
                    },
      ]
    },
    {
      label: '帮助',
      submenu: [
        {
          label: '使用指南',
          accelerator: 'F1',
          click: () => {
            dialog.showMessageBox(mainWindow, {
              type: 'info',
              title: '使用指南',
              message: '📚 密码管理器使用指南',
              detail: `
🚀 快速开始：
1. 首次使用请设置主密码
2. 点击"添加账号"创建新的账号记录
3. 使用搜索框快速查找账号
4. 点击账号卡片查看详细信息

🔧 高级功能：
• 工具 → 密码强度分析：检查所有密码的安全性
• 工具 → 重复密码检查：发现并处理重复使用的密码
• 工具 → 数据备份：导出数据到本地文件
• 工具 → 数据清理：清理无效或重复的数据

💡 使用技巧：
• 使用分类管理不同类型的账号
• 收藏重要账号以便快速访问
• 定期备份数据确保安全
• 使用密码生成器创建强密码

🔒 安全建议：
• 设置复杂的主密码
• 定期更新弱密码
• 不要在不安全的环境下使用
• 及时锁定应用程序
              `,
              buttons: ['确定']
            })
          }
        },
        {
          label: '快捷键参考',
          accelerator: 'F2',
          click: () => {
            dialog.showMessageBox(mainWindow, {
              type: 'info',
              title: '快捷键参考',
              message: '⌨️ 键盘快捷键大全',
              detail: `
🎯 常用操作：
Ctrl+G     生成密码
Ctrl+S     安全检查
Ctrl+R     刷新数据

📝 编辑操作：
Ctrl+Z     撤销
Ctrl+Y     重做
Ctrl+X     剪切
Ctrl+C     复制
Ctrl+V     粘贴
Ctrl+A     全选
Ctrl+F     搜索

🔧 工具功能：
Ctrl+1     密码强度分析
Ctrl+2     重复密码检查
Ctrl+3     数据备份
Ctrl+4     数据清理

🚪 应用控制：
Ctrl+L     锁定应用
Ctrl+Q     退出应用
F11        全屏切换
              `,
              buttons: ['确定']
            })
          }
        },
        { type: 'separator' },
        {
          label: '检查更新',
          click: () => {
            dialog.showMessageBox(mainWindow, {
              type: 'info',
              title: '检查更新',
              message: '🔄 版本检查',
              detail: `
当前版本：v1.0.0
发布时间：2024年9月

✅ 您正在使用最新版本！

🔔 更新内容：
• 全新的密码管理体验
• 军用级AES-256加密
• 智能密码分析工具
• 多格式数据备份

📢 后续更新：
• 云同步功能（规划中）
• 移动端应用（开发中）
• 团队协作功能（设计中）
• 更多安全特性

💡 获取最新版本请访问：
https://github.com/yourusername/password-manager/releases
              `,
              buttons: ['确定', '访问官网'],
              defaultId: 0
            }).then((result) => {
              if (result.response === 1) {
                shell.openExternal('https://github.com/yourusername/password-manager/releases')
              }
            })
          }
        },
        {
          label: '反馈建议',
          click: () => {
            dialog.showMessageBox(mainWindow, {
              type: 'question',
              title: '反馈建议',
              message: '💌 我们需要您的声音',
              detail: `
📝 反馈方式：
• Bug报告：发现问题请及时反馈
• 功能建议：告诉我们您的需求
• 使用体验：分享您的使用感受

🔗 联系我们：
• GitHub Issues（推荐）
• Email: support@passwordmanager.com
• QQ群: 123456789

🎁 反馈奖励：
• 有效bug报告：获得致谢名单
• 优秀建议：参与功能设计讨论
• 持续贡献：成为项目贡献者

💪 一起让密码管理器变得更好！
              `,
              buttons: ['取消', '提交反馈', 'GitHub Issues'],
              defaultId: 1
            }).then((result) => {
              if (result.response === 1) {
                shell.openExternal('mailto:support@passwordmanager.com')
              } else if (result.response === 2) {
                shell.openExternal('https://github.com/yourusername/password-manager/issues/new')
              }
            })
          }
        },
        { type: 'separator' },
        {
          label: '关于密码管理器',
          click: () => {
            dialog.showMessageBox(mainWindow, {
              type: 'info',
              title: '关于密码管理器',
              message: '🔐 密码管理器 v1.0.0',
              detail: `
🚀 功能特性：
• 🔒 AES-256-GCM 军用级加密保护
• 🎯 智能密码强度分析 (基于 zxcvbn 算法)
• 🔍 重复密码检测与批量更新
• 💾 多格式数据备份 (JSON/CSV/TXT)
• 🧹 智能数据清理与优化
• 🎨 现代化响应式界面设计
• ⚡ 快速搜索与分类管理
• 🌟 收藏夹与最近使用功能

🛡️ 安全保障：
• 本地存储，数据不上传云端
• PBKDF2 主密码哈希加密
• 可选备份文件加密保护
• 内存数据自动清理

🔧 技术架构：
• 前端：Vue 3 + Element Plus
• 后端：Electron + Node.js
• 状态管理：Pinia
• 构建工具：Vite

📞 技术支持：
• 开源项目，持续更新维护
• 遵循最佳安全实践标准
• 适用于个人与团队使用

© 2024 密码管理器 - 让密码管理更简单、更安全
              `,
              buttons: ['确定', '查看源码', '报告问题'],
              defaultId: 0,
              cancelId: 0
            }).then((result) => {
              if (result.response === 1) {
                // 查看源码
                shell.openExternal('https://github.com/yourusername/password-manager')
              } else if (result.response === 2) {
                // 报告问题
                shell.openExternal('https://github.com/yourusername/password-manager/issues')
              }
            })
          }
        }
      ]
    }
  ]

  const menu = Menu.buildFromTemplate(template)
  Menu.setApplicationMenu(menu)
}

// 加密解密函数
function encrypt(text, key) {
  const algorithm = 'aes-256-gcm'
  const iv = crypto.randomBytes(16)
  const cipher = crypto.createCipheriv(algorithm, key, iv)
  
  let encrypted = cipher.update(text, 'utf8', 'hex')
  encrypted += cipher.final('hex')
  
  const authTag = cipher.getAuthTag()
  
  return {
    encrypted,
    iv: iv.toString('hex'),
    authTag: authTag.toString('hex')
  }
}

function decrypt(encryptedData, key) {
  const algorithm = 'aes-256-gcm'
  const decipher = crypto.createDecipheriv(algorithm, key, Buffer.from(encryptedData.iv, 'hex'))
  
  decipher.setAuthTag(Buffer.from(encryptedData.authTag, 'hex'))
  
  let decrypted = decipher.update(encryptedData.encrypted, 'hex', 'utf8')
  decrypted += decipher.final('utf8')
  
  return decrypted
}

// IPC 处理器
ipcMain.handle('verify-master-password', async (event, password) => {
  try {
    const data = await fs.readFile(dataPath, 'utf8')
    const parsedData = JSON.parse(data)
    
    // 使用相同的盐值和算法验证密码
    const inputHash = crypto.pbkdf2Sync(password, parsedData.salt, 100000, 64, 'sha256').toString('hex')
    const isValid = inputHash === parsedData.passwordHash
    
    if (isValid) {
      isAppLocked = false
    }
    return isValid
  } catch (error) {
    // 如果文件不存在，这是首次使用
    return password === 'first-time-setup'
  }
})

ipcMain.handle('setup-master-password', async (event, password) => {
  try {
    // 生成随机盐值
    const salt = crypto.randomBytes(32).toString('hex')
    // 使用 PBKDF2 生成密码哈希
    const passwordHash = crypto.pbkdf2Sync(password, salt, 100000, 64, 'sha256').toString('hex')
    
    const initialData = {
      version: '1.0.0',
      passwordHash,
      salt,
      createdAt: new Date().toISOString(),
      accounts: []
    }
    
    await fs.writeFile(dataPath, JSON.stringify(initialData, null, 2))
    isAppLocked = false
    return true
  } catch (error) {
    console.error('设置主密码失败:', error)
    return false
  }
})

ipcMain.handle('load-data', async (event, masterPassword) => {
  try {
    const data = await fs.readFile(dataPath, 'utf8')
    const parsedData = JSON.parse(data)
    
    // 返回解密后的账号数据
    return {
      accounts: parsedData.accounts || [],
      version: parsedData.version,
      createdAt: parsedData.createdAt
    }
  } catch (error) {
    console.error('加载数据失败:', error)
    return { accounts: [] }
  }
})

ipcMain.handle('save-data', async (event, { accounts, masterPassword }) => {
  try {
    
    // 检查文件是否存在
    try {
      await fs.access(dataPath)
    } catch {
      return false
    }
    
    const data = await fs.readFile(dataPath, 'utf8')
    
    const parsedData = JSON.parse(data)
    
    parsedData.accounts = accounts
    parsedData.updatedAt = new Date().toISOString()
    
    const newData = JSON.stringify(parsedData, null, 2)
    await fs.writeFile(dataPath, newData)
    return true
  } catch (error) {
    return false
  }
})

ipcMain.handle('copy-to-clipboard', (event, text) => {
  clipboard.writeText(text)
  
  // 30秒后清除剪贴板
  setTimeout(() => {
    if (clipboard.readText() === text) {
      clipboard.clear()
    }
  }, 30000)
  
  return true
})

ipcMain.handle('check-data-file', async () => {
  try {
    await fs.access(dataPath)
    return true
  } catch {
    return false
  }
})

// 应用设置相关的IPC处理程序
ipcMain.handle('load-app-settings', async () => {
  return appSettings
})

ipcMain.handle('save-app-settings', async (event, settings) => {
  try {
    appSettings = { ...appSettings, ...settings }
    await saveAppSettings()
    
    // 如果托盘菜单的语言发生变化，重新创建托盘
    if (settings.language !== undefined) {
      createTray()
    }
    
    return true
  } catch (error) {
    return false
  }
})

ipcMain.handle('show-main-window', () => {
  if (mainWindow) {
    mainWindow.show()
    mainWindow.focus()
  }
})

ipcMain.handle('hide-main-window', () => {
  if (mainWindow) {
    mainWindow.hide()
  }
})

// 应用事件
app.whenReady().then(createWindow)

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createWindow()
  }
})

// 防止多实例运行
const gotTheLock = app.requestSingleInstanceLock()

if (!gotTheLock) {
  app.quit()
} else {
  app.on('second-instance', () => {
    if (mainWindow) {
      if (mainWindow.isMinimized()) mainWindow.restore()
      mainWindow.focus()
    }
  })
}
